home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ASME's Mechanical Engine…ing Toolkit 1997 December
/
ASME's Mechanical Engineering Toolkit 1997 December.iso
/
ai
/
prlg195b.lzh
/
CAD.LZH
/
ATGS.PRO
< prev
next >
Wrap
Text File
|
1987-04-05
|
15KB
|
515 lines
/*
.pn1
.he DREXEL ATGS */
constrainlist( [constraint1] ).
constraint1( pc_inv, pdcfinv, pcinv ).
buf( pc_buf, pdcfbuf, pcbuf ).
and2( pc_and2, pdcfand2, pcand2 ).
and3( pc_and3, pdcfand3, pcand3 ).
or2( pc_or2, pdcfor2, pcor2 ).
or3( pc_or3, pdcfor3, pcor3 ).
/* The primitive cubes of the logic elements.
Form: pc_type( output, [list of prime implicants] ). */
pc_inv( 0, [[1]] ).
pc_inv( 1, [[0]] ).
pc_buf( 0, [[0]] ).
pc_buf( 1, [[1]] ).
pc_and2( 0, [[0,_],[_,0]] ).
pc_and2( 1, [[1,1]] ).
pc_and3( 0, [[0,_,_],[_,0,_],[_,_,0]] ).
pc_and3( 1, [[1,1,1]] ).
pc_or2( 1, [[1,_],[_,1]] ).
pc_or2( 0, [[0,0]] ).
pc_or3( 1, [[1,_,_],[_,1,_],[_,_,1]] ).
pc_or3( 0, [[0,0,0]] ).
/* The primitive D-cubes of the logic elements: */
pdcfinv( sa0(_), db, [[1]] ).
pdcfinv( sa1(_), d, [[0]] ).
pdcfbuf( sa0(_), d, [[1]] ).
pdcfbuf( sa1(_), db, [[0]] ).
pdcfand2( sa0(_), d, [[1,1]] ).
pdcfand2( sa1(1), db, [[0,1]] ).
pdcfand2( sa1(2), db, [[1,0]] ).
pdcfand3( sa0(_), d, [[1,1,1]] ).
pdcfand3( sa1(1), db, [[0,1,1]] ).
pdcfand3( sa1(2), db, [[1,0,1]] ).
pdcfand3( sa1(3), db, [[1,1,0]] ).
pdcfor2( sa0(1), d, [[1,0]] ).
pdcfor2( sa0(2), d, [[0,1]] ).
pdcfor2( sa1(_), db, [[0,0]] ).
pdcfor3( sa0(1), d, [[1,0,0]] ).
pdcfor3( sa0(2), d, [[0,1,0]] ).
pdcfor3( sa0(3), d, [[0,0,1]] ).
pdcfor3( sa1(_), db, [[0,0,0]] ).
/* The propagation D-cubes of the logic elements: */
pcinv( d, [[db]] ).èpcinv( db, [[d]] ).
pcbuf( d, [[d]] ).
pcbuf( db, [[db]] ).
pcand2( d, [[1,d],[d,1],[d,d]] ).
pcand2( db,[[1,db],[db,1],[db,db]] ).
pcor2( d, [[0,d],[d,0,],[d,d]] ).
pcor2( db, [[0,db],[db,0],[db,db]] ).
pcand3( d,
[[d,1,1],[1,d,1],[1,1,d],[d,d,1],[d,1,d],[1,d,d],[d,d,d]] ).
pcand3( db,
[[db,1,1],[1,db,1],[1,1,db],[db,db,1],[db,1,db],[1,db,db],[db,db,db]] ).
pcor3( d,
[[d,0,0],[0,d,0],[0,0,d],[d,d,0],[d,0,d],[0,d,d],[d,d,d]] ).
pcor3( db,
[[db,0,0],[0,db,0],[0,0,db],[db,db,0],[db,0,db],[0,db,db],[db,db,db]] ).
/* Samples:
Type: and3( pdcfand3, pcand3 ).
Pdcfclass: pdcfand3( sa1(3), db, [[1,1,0]] ).
Gate: r6( or3, 3, [n25,n26,n28], n34 ).
*/
/* Gatelines = [ [x,x,x], [x,x,x],..., [x,x,x] ] */
/* Netnames = [ nx(val), .... nx(val) ] */
/*
Netvals = current assignments of nets: [n1(1), n5(0),.....,nn(x)]
Inputnets = input nets to specific gate: [n1,n3,..nx]
Inputvals = [1,0,.d, db, 0]
*/
listsubt( [], _, Res, Res ).
listsubt( [Head|Mainlist], El, Buildlist, Result ) :-
(Head == El, listsubt( Mainlist, El, Buildlist, Result ));
listsubt( Mainlist, El, [Head|Buildlist], Result ), !.
findouttests( Gate, Fault ) :-
print('\nSynthesizing Output Tests for: ', Gate, ' Fault: ', Fault ),
memleft( Memleft1 ),
print( '\nMemleft start gen: ', Memleft1 ),
(ftout( Gate, Fault ); true),
!.
ftout( Gate, Fault ) :-
gentestoutp( Gate, Fault, TestInputs, TestOutputs ),
asserta( test( Gate, output, Fault, TestInputs, TestOutputs ) ),
print( '\n Testinputs: ', TestInputs ),
print( '\n Testoutputs: ', TestOutputs ),
!,è fail.
findinptests( Gate, Input, Fault ) :-
print('\nSynthesizing Input Tests for: ', Gate, ', Input: ', Input,
' Fault: ', Fault ),
(ftinp( Gate, Input, Fault ); true), !.
ftinp( Gate, Input, Fault ) :-
gentestinp( Gate, Input, Fault, TestInputs, TestOutputs ),
print( '\n Testinputs: ', TestInputs ),
print( '\n Testoutputs: ', TestOutputs ),
asserta( test( Gate, Input, Fault, TestInputs, TestOutputs ) ),
!,
fail.
/*
ftinp( Gate, Input, Fault ) :-
!,
test( Gate, Input, Fault, TestInputs, TestOutputs ),
print( '\n Testinputs: ', TestInputs ),
print( '\n Testoutputs: ', TestOutputs ),
fail.
*/
gentestoutp( Gate, Fault, TestInputs, TestOutputs ) :-
Gate( Type, _, Inplist, Outnet ),
Type( Primcube, _, _ ),
elements( Ellist ),
listsubt( Ellist, Gate, [], Sublist ), !,
(
(
Fault == sa0,
Primcube( 1, Implicants ),
member( Implicant, Implicants ),
pairoff( Inplist, Implicant, [], Netvals ),
ad_vals_to_Net( [Outnet(d)], Netvals, NNetvals )
);
(
Fault == sa1,
Primcube( 0, Implicants ),
member( Implicant, Implicants ),
pairoff( Inplist, Implicant, [], Netvals ),
ad_vals_to_Net( [Outnet(db)], Netvals, NNetvals )
)
),
outputs( Outlist ),
(
(
member( Outnet, Outlist ),
imply1( NNetvals, Sublist, NNNetvals, Undef ),
justify( NNNetvals, Undef, NNNNetvals ),
getinps( NNNNetvals, TestInputs ),è getoutp( NNNNetvals, TestOutputs )
);
(
not( member( Outnet, Outlist ) ),
propagate( NNetvals, Sublist,
NNNetvals, Undef, Solved ),
Solved == true,
justify( NNNetvals, Undef, NNNNetvals ),
getinps( NNNNetvals, TestInputs ),
getoutp( NNNNetvals, TestOutputs )
)
).
gentestinp( Gate, Input, Fault, TestInputs, TestOutputs ) :-
Gate( Type, _, Inplist, Outnet ),
Type( _, Pdcfclass, _ ),
elements( Ellist ),
listsubt( Ellist, Gate, [], Sublist ),
!,
Pdcfclass( Fault(Input), Dtype, Implicants ),
member( Implicant, Implicants ),
pairoff( Inplist, Implicant, [], Netvals ),
outputs( Outlist ),
(
(
member( Outnet, Outlist ),
imply1( [Outnet(Dtype)|Netvals], Sublist, NNetvals, Undef ),
justify( NNetvals, Undef, NNNetvals ),
getinps( NNNetvals, TestInputs ),
getoutp( NNNetvals, TestOutputs )
);
(
not( member( Outnet, Outlist ) ),
propagate( [Outnet(Dtype)|Netvals], Sublist,
NNetvals, Undef, Solved ),
Solved == true,
justify( NNetvals, Undef, NNNetvals ),
getinps( NNNetvals, TestInputs ),
getoutp( NNNetvals, TestOutputs )
)
).
testfanouts :- testf; true.
testf :-
findfanoutpts( Fans ), !,
print('\nElements with fanout:\n ', Fans ),
member( Gate, Fans ),
memleft( Memleft1 ),
print( '\nMemleft start gen: ', Memleft1 ),
findouttests( Gate, sa0 ),
memleft( Memleft2 ),
print( '\nMemleft after sa0: ', Memleft2 ),è findouttests( Gate, sa1 ),
memleft( Memleft3 ),
print( '\nMemleft after sa1: ', Memleft3 ),
fail.
findfanoutpts( Netswfan ) :-
elements( Ellist ),
constrainlist( Constlist ),
ffo( Ellist, Constlist, [], Netswfan ), !.
ffo( [], _, Netform, Netform ).
ffo( [El|Rem], Constlist, Netform, NetRet ) :-
(
El( Type, _, _, Outnet ),
not( member( Type, Constlist ) ),
Outnet( _, _, Inputlist ),
[H|T] = Inputlist, T \= [],
ffo( Rem, Constlist, [El|Netform], NetRet )
);
ffo( Rem, Constlist, Netform, NetRet ).
testoutputs :- testo ; true.
testo :-
findoutputs( Outputs ), !,
member( Gate, Outputs ),
memleft( Memleft1 ),
print( '\nMemleft start gen: ', Memleft1 ),
findouttests( Gate, sa0 ),
memleft( Memleft2 ),
print( '\nMemleft after sa0: ', Memleft2 ),
findouttests( Gate, sa1 ),
memleft( Memleft3 ),
print( '\nMemleft after sa1: ', Memleft3 ),
fail.
findoutputs( Netswfan ) :-
elements( Ellist ),
outputs( Outputs ),
fout( Ellist, Outputs, [], Netswfan ), !.
fout( [], _, Netform, Netform ).
fout( [El|Rem], Outputs, Netform, NetRet ) :-
(
El( Type, _, _, Outnet ),
member( Outnet, Outputs ),
fout( Rem, Outputs, [El|Netform], NetRet )
);
fout( Rem, Outputs, Netform, NetRet ).
testinputs :- testi ; true.è
testi :-
findinputs( Inputs ), !,
member( [Gate,Input], Inputs ),
memleft( Memleft1 ),
print( '\nMemleft start gen: ', Memleft1 ),
findinptests( Gate, Input, sa0 ),
memleft( Memleft2 ),
print( '\nMemleft after sa0: ', Memleft2 ),
findinptests( Gate, Input, sa1 ),
memleft( Memleft3 ),
print( '\nMemleft after sa1: ', Memleft3 ),
fail.
findinputs( InpEls ) :-
elements( Ellist ),
inputs( Inputs ),
finp( Inputs, [], InpEls ), !.
finp( [], Netform, Netform ).
finp( [Inputnet|InpnetRem], Netform, NetRet ) :-
(
Inputnet( _, _, [El|_] ),
El( _, _, Nets, _ ),
member( Inputnet, Nets, Num ),
Numplus is Num + 1,
finp( InpnetRem, [[El,Numplus]|Netform], NetRet )
);
finp( ElRem, InpnetRem, Netform, NetRet ).
justify( Netvals, [], Netvals ).
justify( Netvals, [El|Rem], NewNetReturn ) :-
El( Type, _, Inputs, Outnet ),
replcbyval( Netvals, Inputs, Vals, Varlist ),
Type( Pc, _, _ ),
(
(
member( Outnet(Output), Netvals ),
!,
Pc( Output, Implicants ),
member( Implicant, Implicants ),
Implicant = Vals,
ad_vals_to_Net( Netvals, Varlist, NNetvals ),
imply1( NNetvals, Rem, NNNewNet, Undef ),
justify( NNNewNet, Undef, NewNetReturn )
);
(
not( member( Outnet(Output), Netvals ) ),
justify( Netvals, Rem, NewNetReturn )
)
).è
propagate( Netvals, [], Netvals, [], _ ).
propagate( Netvals, Ellist, NNNNetvals, UndefR, Solved ) :-
usecount(U),
imply1( Netvals, Ellist, NNetvals, UndefEllist ),
ddrive( NNetvals, UndefEllist, NNNetvals, [],
UndefEllist2, Solved, Drive ),
(
(Solved == true, NNNNetvals = NNNetvals, UndefR = UndefEllist2, !);
(
Drive == true,
propagate( NNNetvals, UndefEllist2, NNNNetvals, UndefR, Solved )
)
).
/* Here [] is the empty list of elements currently in the D-frontier. */
ddrive( Netvals, [], Netvals, Undef, UndefR, _, _ ) :-
revlist( Undef, UndefR ).
ddrive( Netvals, [El|Remain], ReturnNewNet, Undefform,
Undefreturn, Solved, Drive ) :-
usecount(U),
El( Type, _, Inputs, Outnet ),
(
(
replcbyval( Netvals, Inputs, Vals, Varlist ),
hasD( Vals ),
Type( _, _, Prcube ),
Prcube( Output, Implicants ),
member( Implicant, Implicants ),
Implicant = Vals,
ad_vals_to_Net( Netvals, Varlist, NNetvals ),
notdup( Outnet, Output, Netvals, NNetvals, NNNetvals ),
Drive = true,
(
(
outputs( Outlist ),
member( Outnet, Outlist ),
Solved = true, !,
ReturnNewNet = NNNetvals,
revlist( Undefform, UdfR ),
appenddef( UdfR, Remain, Undefreturn )
);
ddrive( NNNetvals, Remain, ReturnNewNet,
Undefform, Undefreturn, Solved, Drive )
)
);(
ddrive( Netvals, Remain, ReturnNewNet, è [El|Undefform], Undefreturn, Solved, Drive ))
).
hasD( Inputs ) :- vmember( d, Inputs ); vmember( db, Inputs ).
imply1( Netvals, Ellist, NNetvals, UndefEllist2 ) :-
imply( Netvals, Ellist, NNetvals, [], UndefEllist ),
revlist( UndefEllist, UndefEllist2 ),
!.
imply( NewNetvals, [], NewNetvals, Undef, Undef ).
imply( Netvals, [El|Remain], ReturnNewNet, Undefform, Undefreturn ) :-
usecount(U),
El( Type, _, Inputs, Outnet ),
(
(
replcbyval( Netvals, Inputs, Vals, Varlist ),
not( hasD( Vals ) ),
Type( Pc, _, _ ),
Pc( Output, Implicants ),
member( Implicant, Implicants ),
Implicant == Vals,
notdup( Outnet, Output, Netvals, Netvals, NNNetvals ),
imply( NNNetvals, Remain, ReturnNewNet, Undefform, Undefreturn)
);
imply( Netvals, Remain, ReturnNewNet, [El|Undefform], Undefreturn)
).
notdup( Netval, Val, Netvals, NNetvals, NNetvals ) :-
member( Netval(Extval), Netvals ),
!,
Extval == Val.
notdup( Netval, Val, _, NNetvals, [Netval(Val)|NNetvals] ) :- !.
ad_vals_to_Net( Netvals, Varlist, NewNet ) :-
advals( Netvals, Varlist, NewNet ), !.
advals( Netvals, [], Netvals ).
advals( Netvals, [Head(Val)|Varlist], NNetvalsR ) :-
(
(
atomic(Val),
advals( [Head(Val)|Netvals], Varlist, NNetvalsR )
);
advals( Netvals, Varlist, NNetvalsR )
).
/*
Netvals = current assignments of nets: [n1(1), n5(0),.....,nn(x)]è Inputnets = input nets to specific gate: [n1,n3,..nx]
Inputvals = [1,0,.d, db, 0]
*/
replcbyval( A, B, C, NetVarlist) :-
replcbyval1( A, B, C, [], NetVarlist ), !.
replcbyval1( _, [], [], NetVarlist, NetVarlist ).
replcbyval1( Netvals, [Inputnet|Restnets],
[Inputval|Restvals], NetVarlist, NetVarR ) :-
(
(
member( Inputnet( Inputval ), Netvals ),
NetVarT = NetVarlist
);
(
var( Inputval ),
NetVarT = [Inputnet(Inputval)|NetVarlist]
)
),
replcbyval1( Netvals, Restnets, Restvals, NetVarT, NetVarR ).
getinps( A, B ) :-
inputs( Inplist ),
getinps1( A, Inplist, [], B ), !, Inplist \= [].
getinps1( _, [], Netandvals, Netandvals ).
getinps1( Netvals, [Inputnet|Restnets], Inplistform, Retlist ) :-
(
member( Inputnet( Inputval ), Netvals ),
getinps1( Netvals, Restnets,
[Inputnet(Inputval)|Inplistform], Retlist )
);
getinps1( Netvals, Restnets, Inplistform, Retlist ).
getoutp( A, B ) :-
outputs( Outplist ),
getoutp1( A, Outplist, [], B ), !, Outplist \= [].
getoutp1( _, [], Netandvals, Netandvals ).
getoutp1( Netvals, [Outputnet|Restnets], Outlistform, Retlist ) :-
(
member( Outputnet( Outputval ), Netvals ),
(Outputval == d ; Outputval == db),
getoutp1( Netvals, Restnets,
[Outputnet(Outputval)|Outlistform], Retlist )
);
getoutp1( Netvals, Restnets, Outlistform, Retlist ).
/* funclist = [nx,...,nx], arglist = [1,0,...,etc] */
pairoff( [], [], Result, Result ).èpairoff( [Func|F_rem], [Arg|Arg_rem], Tlist, Reslist ) :-
pairoff( F_rem, Arg_rem, [Func(Arg)|Tlist], Reslist ).
/* Samples:
Type: and3( pdcfand3, pcand3 ).
Pdcfclass: pdcfand3( sa1(3), db, [[1,1,0]] ).
Gate: r6( or3, 3, [n25,n26,n28], n34 ).
*/
appenddef( L1, L2, L3 ) :- append( L1, L2, L3 ), !.
append([],L,L).
append([Z|L1],L2,[Z|L3]) :- append( L1,L2,L3 ).
/* Non-instantiating member, for lists containing variables: */
vmember( X, List ) :- member( Y, List ), X == Y, !.
revlist( List, Reverse ) :- rev( List, [], Reverse ), !.
rev( [], L, L ).
rev( [H|List], Formlist, Retlist ) :-
rev( List, [H|Formlist], Retlist ).